<?php

/**
 * Транслятор объектов в XSL-шаблоны
 */
class XSLTranslator implements iXSLTranslator {

	private
		$xmlTranslator  = null,
		$processor      = null,
		$maybeAdmin     = '';
		
	/**
	 * Регулярное выражение для выбора макросов модулей
	 */
	//const PREG_MODULES_MACROSES = '#{{(.+?)::(.+?)\(([a-zA-Zа-яА-Я0-9_=<>;\,\-\.\/\[\]\*\&\$\'\"]*)\)}}#u';

	public function __construct () {
		$this->xmlTranslator = new XMLTranslator;
		$this->processor = new XSLTProcessor;
		$this->processor->registerPHPFunctions ();
		
		$this->maybeAdmin = CMSController::getInstance()->isAdminMode () ? 'admin/' : '';
	}
	
	/**
	 * Запускает обработку сайта на основе ответа модуля
	 * @param ModuleResponse $oResponse
	 * @param string $sTemplateFileName относительный путь до файла XSL-таблицы (главнй XSL-шаблон)
	 * @return string
	 */
	public function render (ModuleResponse $oResponse) {
		header ('Content-type: text/html; charset=utf-8');
		
		$xml = $this->xmlTranslator->buildPageResponse ($oResponse);
		$html = $this->getHTML ($xml, ENGINE_ROOT . '/templates/' . $this->maybeAdmin . 'xsl/' . $oResponse->getTemplate() . '.xsl');
		
		return $html;
	}
	
	/**
	 * Возвращает обработанный DOM-документ $xml правилами XSL-таблици $sTemplateFileName в виде HTML-кода
	 * @param DOMDocument $xml
	 * @param string $sTemplateFileName относительный путь до файла XSL-таблицы
	 * @return string
	 */
	private function getHTML (DOMDocument $xml, $sTemplateFileName) {
		if (!file_exists ($sTemplateFileName)) {
			throw new CoreException (lang('error_template_not_found',__CLASS__) . $sTemplateFileName);			
		}
		
		$xslTpl = new DOMDocument;
		$xslTpl->substituteEntities = true;
		$xslTpl->resolveExternals = true;
		$xslTpl->load ($sTemplateFileName);

		$this->processor->importStyleSheet ($xslTpl);
		$html = $this->processor->transformToXML ($xml);
		
		return $html;
	}
	
	/**
	 * Обработчик макросов
	 * @param string $html html-код
	 * @return string
	 */
	/*private function htmlMacrosRender ($html) {
		$cacheController = CacheController::getInstance ();
		$cmsController = CMSController::getInstance();
		
		preg_match_all (self::PREG_MODULES_MACROSES, $html, $macroses);
		$numM = count ($macroses[0]);
		
		for ($i=0; $i<$numM; ++$i) {
			$module = trim ($macroses[1][$i]);
			$method = trim ($macroses[2][$i]);
			$params = trim ($macroses[3][$i]) == '' ? false : explode (',', trim ($macroses[3][$i]));
			
			if ($params) {
				$cntParams = count ($params);
				for ($j = 0; $j < $cntParams; ++$j) {
					$params[$j] = trim ($params[$j], '"');
					$params[$j] = trim ($params[$j], "'");
				}
			}
			
			$oModuleResponse = $cmsController->runModuleMethod ($module, $method, $params, true);
			
			$sTemplate = $oModuleResponse->getTemplate ();
			
			if ($sTemplate == '') {
				$html = str_replace ($macroses[0][$i], "Macros error: Template not defined.", $html);
				return $html;
			}
			
			$xml = $this->xmlTranslator->buildPageResponse ($oModuleResponse);
			$sTemplateFileName = ENGINE_ROOT . '/templates/' . $this->maybeAdmin . 'xsl/' . $oModuleResponse->getTemplate () . '.xsl';
			
			$value = $this->getHTML ($xml, $sTemplateFileName);
			
			$value = preg_replace ('#<!DOCTYPE(.*)dtd">#', '', $value);
			
			$html = str_replace ($macroses[0][$i], $value, $html);			
		}
		
		return $html;
	}*/

}